package com.aaa.qy127.service.impl;

import com.aaa.qy127.dao.BookDao;
import com.aaa.qy127.dao.TypeDao;
import com.aaa.qy127.entity.Book;
import com.aaa.qy127.service.BookService;
import com.aaa.qy127.util.CodeAndMsg;
import com.aaa.qy127.util.Result;
import com.sun.org.apache.bcel.internal.classfile.Code;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

@Service("bookServiceImpl")
public class BookServiceImpl implements BookService {

    /*
    * 注入 BookDao 接口
    * */
    @Resource(name = "bookDaoImpl")
    private BookDao bookDao;

    @Resource(name = "typeDaoImpl")
    private TypeDao typeDao;


    /**
     * 查询全部 并分页
     * @param book
     * @return
     */
    @Override
    public Result selBook(Book book){
        List<Map<String, Object>> allBook = bookDao.getAllBook(book);
        int getcount = bookDao.getcount(book);
        Result result = new Result(getcount, allBook);
        return result;
    }

    /**
     * 修改状态
     * @param bookid
     * @param status
     * @return
     */
    @Override
    public CodeAndMsg updStatus(Integer bookid,Integer status){
        CodeAndMsg codeAndMsg = new CodeAndMsg();
        int countByBookId = bookDao.getCountByBookId(bookid);
        if (status == 1){
            int i = bookDao.updataStatus(bookid, status);
            if (i>0){
                codeAndMsg.setCode(1001);
                codeAndMsg.setMsg("下架成功");
            }else {
                codeAndMsg.setCode(1002);
                codeAndMsg.setMsg("下架失败");
            }
        }else {
            if (countByBookId > 5){
                int i = bookDao.updataStatus(bookid, status);
                if (i>0){
                    codeAndMsg.setCode(1001);
                    codeAndMsg.setMsg("上架成功");
                }else {
                    codeAndMsg.setCode(1002);
                    codeAndMsg.setMsg("上架失败");
                }
            }else {
                codeAndMsg.setCode(1003);
                codeAndMsg.setMsg("书籍剩余太少，不能上架");
            }
        }
        return codeAndMsg;
    }

    /**
     * 修改 或 新增 book 的信息 的业务
     * @param book
     * @return
     */
    @Override
    public CodeAndMsg updAndInsBook(Book book){

        Integer bookid = book.getBookid();
        //代表按照书籍名字查询
        List<Map<String, Object>> oneBook = bookDao.getOneBook(book);
        //按照 出版社 查询
        List<Map<String, Object>> bookByPublisher = bookDao.getBookByPublisher(book);
        //按照bookid bookname  publisher 查询
        List<Map<String, Object>> oneBookByBookidAndPublisherAndBookname = bookDao.getOneBookByBookidAndPublisherAndBookname(book);
        //根据 bookid 查询 该书籍的 图片信息
        List<Map<String, Object>> bookUrlBybookid = bookDao.getBookUrlBybookid(book);
        CodeAndMsg codeAndMsg = new CodeAndMsg();
        int i = 0;
        if (bookid == null){
            if (oneBook == null){
                i = bookDao.insertOneBook(book);
                if (i>0){
                    book.setBookid(i);
                    //执行向 t_book_tp 表中添加 多张图片
                    bookDao.insertAllUrl(book);
                    //获取到 该bookid 中 status 的图片 并 返回
                    String oneBookUrl = bookDao.getOneBookUrl(book);
                    //System.out.println("service 类"+oneBookUrl);
                    //将这个图片的路径 设置到book中
                    book.setUrl(oneBookUrl);
                    //然后修改 book 表中的 url
                    bookDao.updateUrlByBookId(book);
                    codeAndMsg.setCode(1001);
                    codeAndMsg.setMsg("新增成功");
                }else {
                    codeAndMsg.setCode(1002);
                    codeAndMsg.setMsg("新增失败");
                }
            }else {
                if (bookByPublisher == null){
                    i = bookDao.insertOneBook(book);
                    if (i>0){
                        book.setBookid(i);
                        //执行向 t_book_tp 表中添加 多张图片
                        bookDao.insertAllUrl(book);
                        //获取到 该bookid 中 status 的图片 并 返回
                        String oneBookUrl = bookDao.getOneBookUrl(book);
                        //System.out.println("service 类"+oneBookUrl);
                        //将这个图片的路径 设置到book中
                        book.setUrl(oneBookUrl);
                        //然后修改 book 表中的 url
                        bookDao.updateUrlByBookId(book);
                        codeAndMsg.setCode(1001);
                        codeAndMsg.setMsg("新增成功");
                    }else {
                        codeAndMsg.setCode(1002);
                        codeAndMsg.setMsg("新增失败");
                    }
                }else {
                    codeAndMsg.setCode(1003);
                    codeAndMsg.setMsg("该书籍已经存在");
                }
            }

        }else { //修改 的 代码
            if (oneBook == null){
                i = bookDao.updateBook(book);
                if (bookUrlBybookid == null){
                    //执行向 t_book_tp 表中添加 多张图片
                    bookDao.insertAllUrl(book);
                    //获取到 该bookid 中 status 的图片 并 返回
                    String oneBookUrl = bookDao.getOneBookUrl(book);
                    //System.out.println("service 类"+oneBookUrl);
                    //将这个图片的路径 设置到book中
                    book.setUrl(oneBookUrl);
                    //然后修改 book 表中的 url
                    bookDao.updateUrlByBookId(book);
                }else {
                    int shanchu = bookDao.deleteBookUrlByBookid(book);
                    if (shanchu>0){
                        //执行向 t_book_tp 表中添加 多张图片
                        bookDao.insertAllUrl(book);
                        //获取到 该bookid 中 status 的图片 并 返回
                        String oneBookUrl = bookDao.getOneBookUrl(book);
                        //System.out.println("service 类"+oneBookUrl);
                        //将这个图片的路径 设置到book中
                        book.setUrl(oneBookUrl);
                        //然后修改 book 表中的 url
                        bookDao.updateUrlByBookId(book);
                    }
                }
                if (i>0){
                    codeAndMsg.setCode(1001);
                    codeAndMsg.setMsg("修改成功");
                }else {
                    codeAndMsg.setCode(1002);
                    codeAndMsg.setMsg("修改失败");
                }
            }else {
                if (bookByPublisher == null){
                    i = bookDao.updateBook(book);
                    if (bookUrlBybookid == null){
                        //执行向 t_book_tp 表中添加 多张图片
                        bookDao.insertAllUrl(book);
                        //获取到 该bookid 中 status 的图片 并 返回
                        String oneBookUrl = bookDao.getOneBookUrl(book);
                        //System.out.println("service 类"+oneBookUrl);
                        //将这个图片的路径 设置到book中
                        book.setUrl(oneBookUrl);
                        //然后修改 book 表中的 url
                        bookDao.updateUrlByBookId(book);
                    }else {
                        int shanchu = bookDao.deleteBookUrlByBookid(book);
                        if (shanchu>0){
                            //执行向 t_book_tp 表中添加 多张图片
                            bookDao.insertAllUrl(book);
                            //获取到 该bookid 中 status 的图片 并 返回
                            String oneBookUrl = bookDao.getOneBookUrl(book);
                            //System.out.println("service 类"+oneBookUrl);
                            //将这个图片的路径 设置到book中
                            book.setUrl(oneBookUrl);
                            //然后修改 book 表中的 url
                            bookDao.updateUrlByBookId(book);
                        }
                    }
                    if (i>0){
                        codeAndMsg.setCode(1001);
                        codeAndMsg.setMsg("修改成功");
                    }else {
                        codeAndMsg.setCode(1002);
                        codeAndMsg.setMsg("修改失败");
                    }
                }else {
                    if (oneBookByBookidAndPublisherAndBookname == null){
                        codeAndMsg.setCode(1003);
                        codeAndMsg.setMsg("该书籍已经存在");
                    }else {
                        i = bookDao.updateBook(book);
                        if (bookUrlBybookid == null){
                            //执行向 t_book_tp 表中添加 多张图片
                            bookDao.insertAllUrl(book);
                            //获取到 该bookid 中 status 的图片 并 返回
                            String oneBookUrl = bookDao.getOneBookUrl(book);
                            //System.out.println("service 类"+oneBookUrl);
                            //将这个图片的路径 设置到book中
                            book.setUrl(oneBookUrl);
                            //然后修改 book 表中的 url
                            bookDao.updateUrlByBookId(book);
                        }else {
                            int shanchu = bookDao.deleteBookUrlByBookid(book);
                            if (shanchu>0){
                                //执行向 t_book_tp 表中添加 多张图片
                                bookDao.insertAllUrl(book);
                                //获取到 该bookid 中 status 的图片 并 返回
                                String oneBookUrl = bookDao.getOneBookUrl(book);
                                //System.out.println("service 类"+oneBookUrl);
                                //将这个图片的路径 设置到book中
                                book.setUrl(oneBookUrl);
                                //然后修改 book 表中的 url
                                bookDao.updateUrlByBookId(book);
                            }
                        }
                        if (i>0){
                            codeAndMsg.setCode(1001);
                            codeAndMsg.setMsg("修改成功");
                        }else {
                            codeAndMsg.setCode(1002);
                            codeAndMsg.setMsg("修改失败");
                        }
                    }
                }
            }
        }
        return codeAndMsg;
    }

    /**
     * 通过 bookid 查询所有的 该 book的图片 并 发送的前端
     * @param bookid
     * @return
     */
    @Override
    public List<Map<String, Object>> getImgByBookId(String bookid){
        List<Map<String, Object>> imgByBookId = bookDao.getImgByBookId(bookid);
        return imgByBookId;
    }

    /**
     * 通过 url 删除 书籍图片， 如果该书籍图片的路径和 book 表中的一致，则 把 book表中的也修改掉
     * @param url
     * @return
     */
    @Override
    public CodeAndMsg deleteBookUrl(String url) {
        //查询到的 book表中的url
        String oneBookUrlByurl = bookDao.getOneBookUrlByurl(url);
        //System.out.println(oneBookUrlByurl+"Service");
        //System.out.println(oneBookUrlByurl == url+"Service");
        //System.out.println(oneBookUrlByurl.equals(url));
        //System.out.println(url);
        CodeAndMsg codeAndMsg = new CodeAndMsg();
        if (oneBookUrlByurl.equals(url)){
            int i = bookDao.deleteBookUrl(url);
            bookDao.updateBookUrlByUrl(url);
            if (i>0){
                codeAndMsg.setCode(1001);
                codeAndMsg.setMsg("删除成功");
            }else {
                codeAndMsg.setCode(1002);
                codeAndMsg.setMsg("删除失败");
            }
        }else {
            int i = bookDao.deleteBookUrl(url);
            if (i>0){
                codeAndMsg.setCode(1001);
                codeAndMsg.setMsg("删除成功");
            }else {
                codeAndMsg.setCode(1002);
                codeAndMsg.setMsg("删除失败");
            }
        }
        return codeAndMsg;
    }

    /**
     * 用新上传的 url 路径 把 之前的 url 路径 替换掉
     * 如果这个url 和 book表中的 路径相同 就把 book表和book_tp表中的url都替换了
     * 如果这个url 和book表中的路径不同 就只需要 更换 book_tp表中的url 就可以了
     * @param urlNew
     * @param urlOld
     * @return
     */
    @Override
    public CodeAndMsg updateBookUrl(String urlNew, String urlOld) {
        //通过老的 url 查询处 book表中的 url 路径
        String oneBookUrlByUrlOld = bookDao.getOneBookUrlByUrlOld(urlOld);
        CodeAndMsg codeAndMsg = new CodeAndMsg();
        if (oneBookUrlByUrlOld.equals(urlOld)){
            //修改book_tp表中的 url 路径
            int i = bookDao.updateBookTpUrlByUrlOldAndNew(urlNew, urlOld);
            //修改book表中的 url 路径
            int i1 = bookDao.updateBookUrlByUrlOldAndUrlNew(urlNew, urlOld);
            if (i>0){
                codeAndMsg.setCode(1001);
                codeAndMsg.setMsg("修改成功");
            }else {
                codeAndMsg.setCode(1002);
                codeAndMsg.setMsg("修改失败");
            }
        }else {
            int i = bookDao.updateBookTpUrlByUrlOldAndNew(urlNew, urlOld);
            if (i>0){
                codeAndMsg.setCode(1001);
                codeAndMsg.setMsg("修改成功");
            }else {
                codeAndMsg.setCode(1002);
                codeAndMsg.setMsg("修改失败");
            }
        }
        return codeAndMsg;
    }

    /**
     * 查询所有的书籍的名字 和 id 通过 typeid 查询 书籍的名字 和 id
     * @return
     */
    @Override
    public List<Map<String, Object>> selectBookNameAndBookid(String typeid) {
        List<Map<String, Object>> maps = bookDao.selectBookNameAndBookid(typeid);
        return maps;
    }

    /**
     * 通过 bookid 查询 这个书籍的 出版社
     * @param bookid
     * @return
     */
    @Override
    public List<Map<String, Object>> selectPublisherAndBookid(String bookid) {
        List<Map<String, Object>> maps = bookDao.selectPublisherAndBookid(bookid);
        return maps;
    }

    /**
     * 获取到 所有的 书籍的信息
     * @return
     */
    @Override
    public List<Map<String, Object>> getAllBook(HttpServletRequest request) {
        HttpSession session = request.getSession();
        List<Map<String, Object>> allBook = bookDao.getAllBook();
        session.setAttribute("allBook",allBook);
        return allBook;
    }

    /**
     * 获取所有的 类型的 信息
     * @return
     */
    @Override
    public List<Map<String, Object>> showTyid(HttpServletRequest request) {
        HttpSession session = request.getSession();
        //查询 数据类型
        List<Map<String, Object>> allLimit = typeDao.getAllLimit();
        session.setAttribute("allLimit",allLimit);
        return allLimit;
    }

    /**
     * 通过 bookid 获取 该 书籍的 所有的图片
     * @param bookid
     * @return
     */
    @Override
    public CodeAndMsg showBookByBookid(String bookid,HttpServletRequest request) {
        HttpSession session = request.getSession();
        //查询到 该bookid 对应的 书籍的信息
        List<Map<String, Object>> book = bookDao.showBookByBookid(bookid);
        //System.out.println(book);
        //查询到 该 bookid  对应的 所有的 书籍图片的信息
        List<Map<String, Object>> bookurl = bookDao.showBookUrlByBookid(bookid);
        //System.out.println(bookurl);

        //将 查询到的 书籍信息 和 书籍图片信息 添加到session 中
        session.setAttribute("book",book);
        session.setAttribute("bookurl",bookurl);
        CodeAndMsg codeAndMsg = new CodeAndMsg();
        codeAndMsg.setCode(1001);
        codeAndMsg.setMsg("执行成功");
        return codeAndMsg;
    }

    /**
     * 通过 typid 查询出 该 类型的 书籍 的 信息
     * @param typeid
     * @param request
     * @return
     */
    @Override
    public List<Map<String, Object>> showBookBytypeid(String typeid, HttpServletRequest request) {
        HttpSession session = request.getSession();
        List<Map<String, Object>> allType = typeDao.getAllType();
        session.setAttribute("allType",allType);
        List<Map<String, Object>> bookBytypeid = bookDao.showBookBytypeid(typeid);
        session.setAttribute("bookBytypeid",bookBytypeid);

        return bookBytypeid;
    }

    /**
     * 按照 bookname 模糊查询
     * @param bookname
     */
    @Override
    public List<Map<String, Object>> selectSomeBookBybookname(String bookname, HttpServletRequest request) {
        List<Map<String, Object>> maps = bookDao.selectSomeBookBybookname(bookname);
        //System.out.println("service"+maps);
        request.getSession().setAttribute("someBook",maps);
        return maps;
    }

}
